"""
Просмтр участников чата по разным критериям/

- Участники в сети, их платформа, отлов "невидимок", какой процент в сети.
- Таблица лидеров по количеству приглашённых участников.
- Администраторы чата.
- Заблокированных/Удалённые участники (собачки).
- Участников не в сети, от большего к меньшему времени.
- Случайный участник чата с указаннием ваешго текста.
- Таблица ветеранов чата.

Author: Milinuri Nirvalen
Ver: 1.5.2 (11)
"""

from chiori import Plugin
from libs.chat_control import count_time
from libs.chat_control import get_str_time
from libs.vk import args
from libs.vk import get_ids
from libs.vk import get_profiles

import random
import time


p = Plugin(name='участники чата', backend='vk',
	desc='список учстников чата по разным притериям',
	args={'target':args['target']})

emojis = ['😀', '😃', '😄', '😁', '😅', '😆', '😂', '🤣', '😉', '☺', '🙂',
'😇', '😗', '😙', '😚', '🤗', '😋', '😜', '🤪', '😝', '🤑', '🤭', '🤐', '🤫',
'😶', '🤔', '🤨', '🧐', '🙄', '😏', '😌', '🤤', '😴', '🤓', '😎', '🥳', '🤠',
'😳', '🥺', '😈', '🤧', '🥶', '🥵', '😸', '😹', '😼', '😽', '🙀', '😿', '😾',
'👻']


def decor_date(ctx, t):
	dt = ctx.now - t
	m = dt//60

	if dt <= 60:
		return f'{dt} с.н.'
	elif dt <= 60*60:
		s = dt%60
		return f'{dt//60}:{f"0{s}" if s<10 else s} м.н.'
	elif m <= 60*24:
		return f'{m//60}:{f"0{m%60}" if m%60 < 10 else m%60} ч.н.'

	else:
		return time.ctime(t)

# commands
# ========

@p.command('онлайн', 'online', 'onl',
	usage='список участников в сети и их платформа',
	check_func='isChioAdmin', else_func='chioNotAdmin')
async def onlineUsers(event, ctx):
	profiles = event.get('to.profiles')
	text = 'участники в сети:'
	online = ''
	offline = ''

	on = []
	i = 0

	for k, v in profiles.items():
		if v.get('deactivated') or not v.get('last_seen'):
			continue

		emoji = random.choice(emojis)
		name = v["name"]

		if v["online"]:
			on.append(k)
			online += f"\n{emoji} │ {name}"

		elif ctx.now-v["last_seen"]["time"] < 30:
			i += 1
			on.append(k)
			offline += f'\n{emoji} │ {name} ({ctx.now-v["last_seen"]["time"]}с. назад)'

	pr = round(100/len(profiles)*len(on))

	if len(on) > 1:
		text += offline

	if online and len(on) > 1:
		text += online
		text += f'\n\n💡 онлайн: {len(on)} (👻{i}) / {len(profiles)} ({pr}%)'
	else:
		text += f'\n👻 │ никого...'
		text += f'\n\n❄ онлайн: {len(on)} (👻{i}) / {len(profiles)} ({pr}%)'

	await ctx.message(text)


@p.command('<u/user(s) from>', 'от',
	usage='<target> показать приглашённых участников',
	check_func='isChioAdmin', else_func='chioNotAdmin')
async def usersFrom(event, ctx):
	profiles = event.get('to.profiles')
	targets = await get_ids(event, ctx)
	text = ''

	for x in targets:
		text += f'\nот {profiles[x]["name"]}:'
		i = 0

		for k, v in profiles.items():
			if str(v["invited_by"]) == x:
				i += 1
				text += f'\n-- [{k}] {v["name"]}'

		pr = round(i/len(profiles)*100, 2)
		text += f'\n* {i}/{len(profiles)} ({pr}%)\n'
	await ctx.message(text)


@p.command('admins', "администраторы", 'админы',
	usage='список администраторов беседы',
	check_func='isChioAdmin', else_func='chioNotAdmin')
async def chatAdmins(event, ctx):
	profiles = event.get('to.profiles')
	admins = list(filter(lambda x: profiles[x].get('is_admin'), profiles.keys()))
	text = f'адмнистраторы в чате ({len(admins)}):'

	for x in admins:
		text += f'\n-- {profiles[x]["name"]}'

	await ctx.message(text)


@p.command('dogs', 'собачки',
	usage='заблокированные/удалённые пользователи в чате',
	check_func='isChioAdmin', else_func='chioNotAdmin')
async def deactivatedUsers(event, ctx):
	profiles = event.get('to.profiles')
	ids = list(filter(lambda x: profiles[x].get('deactivated'), profiles.keys()))
	text = f'собачки в чате ({len(ids)}):'

	for x in ids:
		text += f'\n-- {profiles[x]["name"]}'

	await ctx.message(text)


@p.command('offline', 'оффлайн', 'offl',
	usage='последнее появление пользователей в сети',
	check_func='isChioAdmin', else_func='chioNotAdmin')
async def offlineUsers(event, ctx):
	profiles = event.get('to.profiles')
	text = f'последнее появление пользователей в сети:'

	i = 0
	for k, v in sorted(profiles.items(), key=lambda x: x[1].get('last_seen', {}).get('time', 0)):
		if v.get('deactivated'):
			continue

		i += 1
		if v.get('last_seen'):
			text += f'\n-- [{k}: {decor_date(ctx, v["last_seen"]["time"])}]: {v["name"]}'
		else:
			text += f'\n-- [{k}]: {v["name"]}'

		if i > 30:
			break

	await ctx.message(text)


@p.command('who', 'кто', usage='<text> кто-то, что-то',
	check_func='isChioAdmin', else_func='chioNotAdmin')
async def who(event, ctx):
	u = random.choice(list(event.get('to.profiles', {}).values()))
	await ctx.message(f'\n{u["name"]} {ctx.sargs}.')


@p.command('олды', 'olders', usage='таблица лидеров самых старых участников',
	check_func='isChioAdmin', else_func='chioNotAdmin')
async def oldersLeaderbord(event, ctx):
	text = f'олды беседы:'
	profiles = event.get('to.profiles')

	count = -1
	for k, pr in sorted(profiles.items(), key=lambda x: x[1]["join_date"]):
		count += 1

		if count == 0:
			i = "👑"
		elif count == 1:
			i = "🥇"
		elif count == 2:
			i = "🥈"
		elif count == 3:
			i = "🥉"
		else:
			i = count

		t = time.ctime(pr["join_date"])
		dt = count_time(ctx.now-pr["join_date"])

		text += f'\n{i} {pr["name"]} - {get_str_time(dt)} ({t})'

		if count == 20:
			break
	await ctx.message(text)


@p.command('<top invite(rs)>', 'пригласившие',
	usage='таблица лидеров по приглашению участников',
	check_func='isChioAdmin', else_func='chioNotAdmin')
async def inviteLeaderbord(event, ctx):
	text = 'таблица лидеров пригласивших'
	index = {}

	for k, v in event.get('to.profiles').items():
		if str(v["invited_by"]) in index:
			index[str(v["invited_by"])] += 1
		else:
			index[str(v["invited_by"])] = 1

	i = 0
	profiles = await get_profiles(event, ctx, index.keys())
	for k, v in sorted(index.items(), key=lambda x: x[1], reverse=True):
		i += 1
		percent = round(v/len(event.get('to.profiles'))*100, 2)

		if int(k) > 0:
			pr = profiles[k]
			text += f'\n{i}. [{percent}%] {pr["name"]}: {v}'

		else:
			text += f'\n{i}. [{percent}%] группа: {v}'

	await ctx.message(text)
